package com.gitee.magic.jdbc.persistence.source.jdbc.sqlplus.conditions.interfaces;

import java.util.function.Function;

/**
 * <p>
 * 查询条件封装
 * 嵌套
 * </p>
 *
 * @author Start
 */
public interface Nested<This> {

    /**
     * ignore
     * @param func
     * @return
     */
    default This and(Function<This, This> func) {
        return and(true, func);
    }

    /**
     * AND 嵌套
     * 例: and(i -> i.eq("name", "李白").ne("status", "活着"))
     *
     * @param condition 执行条件
     * @param func      函数
     * @return
     */
    This and(boolean condition, Function<This, This> func);

    /**
     * ignore
     * @param func
     * @return
     */
    default This or(Function<This, This> func) {
        return or(true, func);
    }

    /**
     * OR 嵌套
     * 例: or(i -> i.eq("name", "李白").ne("status", "活着"))
     *
     * @param condition 执行条件
     * @param func      函数
     * @return
     */
    This or(boolean condition, Function<This, This> func);

    /**
     * ignore
     * @param func
     * @return
     */
    default This nested(Function<This, This> func) {
        return nested(true, func);
    }

    /**
     * 正常嵌套 不带 AND 或者 OR
     * 例: nested(i -> i.eq("name", "李白").ne("status", "活着"))
     *
     * @param condition 执行条件
     * @param func      函数
     * @return
     */
    This nested(boolean condition, Function<This, This> func);
}
